#ifndef SC_FRAME_SINK_H
#define SC_FRAME_SINK_H

#include "common.h"

#include <assert.h>
#include <stdbool.h>
#include <libavcodec/avcodec.h>

/**
 * trait 类似于接口，又与接口不同。搜索“计算机 trait”查看相关的信息
 * Frame sink trait. 视频帧接收特性
 * 接收 AVFrames 的组件需要实现这个特性
 * Component able to receive AVFrames should implement this trait.
 */
struct sc_frame_sink {
    // 回调函数
    const struct sc_frame_sink_ops *ops;
};

/* 视频帧接收回调事件 */
struct sc_frame_sink_ops {
    /* The codec context is valid until the sink is closed */

    // 打开
    // \param sink
    // \return 
    bool (*open)(struct sc_frame_sink *sink, const AVCodecContext *ctx);

    // 关闭
    // \param sink    
    void (*close)(struct sc_frame_sink *sink);

    // 推送
    // \param sink
    // \param frame
    // \return     
    bool (*push)(struct sc_frame_sink *sink, const AVFrame *frame);
};

#endif
